マルチブートの仕方(Linux初級編)
Windowsとのマルチブートの説明の前に、Linux自身のブートシーケンスについて見てみよう。LinuxにはLILO(Linux Loader)と呼ばれる独自のローダがある。Linuxを起動するにはLinuxカーネルを読み込まなければいけないのだが、Linuxカーネル自身にもローダがあって、フロッピー起動の場合はLinuxカーネル自身のローダで起動されることができる。緊急ブートディスクなどはこの手法で起動されるのが普通である。
ただしハードディスク起動の場合、このローダは使えず何らかのカーネルローダが必要になる。現在LinuxカーネルをロードできるローダはLILOの他、DOSから起動するLOADLIN、及びサードパティのGRUBなどあるが、通常はハードディスク起動の場合、LILOが必須であると考えてもらって差し支えないと思う。
[Linuxのブートシーケンス(MBR編)]
LILOは大きく分けると、2nd Boot Loaderを呼び出し、最低限の情報を提供する極小さな(400Bytes程度)プログラム「1st Boot Loader」と、それによって呼び出され、カーネルのロードなど本格的なブート作業を一手に担うローダー「2nd Boot Loader」と、各種位置情報を格納するMapFileや、他のOSの起動を手伝うチェーンローダなどで構成されている、サイズ的には比較的大きなプログラムである。
多くのディストリビューションのインストーラにおいて、LILOをよくMBRにインストールするか、ルートパーティションにインストールするか、フロッピーディスクにインストールするか選択するが、実際この選択によってインストール先が変わるのは「1st Boot loader」だけである。1st Boot Loader以外は全て、いずれの選択肢をとっても通常はルートパーティションにインストールされる。* 上の図はMBRに1st Boot Loaderをインストールした場合だが、この場合は1st Boot LoaderはBIOSによってロードされる。
*これは多くのインストーラの動作であり、LILOの仕様的には各データ毎に様々な位置に配置することができる。
他にルートパーティションにLILOを、つまりは1st Boot Loaderをインストールした場合のシーケンスを示す。
[Linuxのブートシーケンス(ROOT編)]
この場合、1st Boot Loaderの読み込みはMBRのブートストラップローダに任せている点が、MBRにインストールした場合と違う訳である。それ以外は全く同じだ。ここではこれ以上詳しくLILOの動作を説明しないが、このようにLILOは実際多数の大きなプログラムから構成されている。LILOの動作についてもっと詳しく知りたい場合は佐野さんの「LILO "the Linux Loader" の動作について」が非常に詳しいのでご参照願う。
実行時に「LILO:」というプロンプトが画面に表示されるが、これが表示された時には既に上記のプログラムは全て実行されている。従ってMBRにLILOから別のパーティションのOSを起動したとしても、実際はMBRからそのパーティションに直接飛んでいる訳ではなく、一旦全ての制御がLinuxルートパーティションにあるプログラムに移っている訳で、そこから他のパーティションに飛ぶという順序を踏む。
しかし、ここでは話を簡単にするためこれらを一応1つのLILOとして扱う。1st Boot Loaderのあるところに全てのLILOプログラムがあるとして仮想して話を聞いてほしい。実際はそれでも殆ど不都合はない。それは上の図でも示してある通り、LILOプログラムのアクセスは全て直接アドレス指定アクセスであり、特定のファイルシステムに依存したアクセスをしている訳ではないからである。従ってLILOプログラムがどこにあろうと、殆ど関係ない。
また本来はLILOについて、最低インストール方法やその後の設定の変更のための/etc/lilo.confの基礎的な記述方法は知っているという前提で話をしたいのであるが、必ずしもそういう方ばかりではないだろうから、「LILOの導入と基礎」をいうページを設けたので、LILOのことがよくわからない人はまずこちらから読んでほしい。またman lilo.confやman liloは一応目を通しておいてほしい。
またマルチブートだけでなく、LILOを体系的に勉強したい人は「LILO」をご覧いただきたい。まあただのリンク集だが。
Windowsがインストールされている環境に後からLinuxをインストールした場合、非常に簡単にLinuxとのデュアルブートを実現できる。多くのディストリビューションのインストーラは自動的にWindowsを見つけて、エントリに追加してくれるからである。また既にWindows9x系とWindows NTのデュアルブート環境ができている場合はこの環境には全く関与しないので、これを破壊してしまうこともない。従って簡単にトリプルブート環境が構築される。インストーラが作ったWindowsとのデュアルブート環境の場合、以下のような/etc/lilo.confになっている場合が多いだろう。
[WindowsとLinuxのデュアルブートした場合の/etc/lilo.confの内容]
boot = /dev/hda map = /boot/map prompt timeout = 50 image = boot/vmlinux label = linux root = /dev/hda2 other = /dev/hda1 label = win table = /dev/hda |
上図の「other」の部分が、Windowsの起動に関する記述部分である。「other = /dev/hda1」とは第1IDE HDDの最初のパーティションにあるブートセクターを読み込みなさいということを表している。
これによってLILOからLinuxとWindowsの2つの分岐が可能になる。更に分岐後、その先にNTLDRがあれば、これがまたWindows95とWindows NTのデュアルブートができて、2段構えでトリプルブートが実現する。その場合のシーケンスを以下に示す。
[LILOによるNTと98とLinuxのトリプルブートのシーケンス1]
PCを起動するとまずMBRにあるLILOが実行される。ここでLILOプロンプトに対して「linux」と入力するか、何も入力せずにEnterを押せば、Linuxが起動し、「win」とタイプしてEnterを押せば、Windowsパーティションのブートセクターが読み込まれ、やがてNTLDRが読み込まれる。(デフォルトは変更できる。lilo.confで一番上に書けばデフォルトになるので、Winの方をデフォルトにすることも可能である)
NTLDRが読み込まれた後はWindows9xとWindows NTのデュアルブートの場合と同じだ。ブートメニューが出るので、ここでNTを選ぶかWindows9xを選べば言い訳である。
Window95 -> Windows NT -> Linuxという順序でインストールしていけば、殆ど難しいことは考えずに上記のようなトリプルブート環境が完成してしまう。前述のlilo.confも大抵はLinuxのインストーラが自動で作成してくれる。ただしインストール中にWindows(dos)とのデュアルブートを行うか尋ねてくる場合もあるだろう。その場合はYesと答えないと自動では作ってくれないだろう。またLabelとかパーティションを自分で指定しないといけない場合もあるかもしれない。
またLILOのインストール先も基本的にどこでも構わない。上記シーケンス図ではMBRにインストールした場合のものである。MBRにインストールする場合はLinuxパーティションが論理領域でも構わないという利点がある。一方LinuxルートパーティションにLILOをインストールする場合はそのパーティションが基本領域でかつアクティブである必要があり、注意が必要だ。これはLILOのロードをMBRのブートストラップローダに任せる関係上、PC/AT互換機の一般仕様に従わねばならないためである。このあたりの理由はブートの仕組みを正しく理解できていれば、特にあらためて説明する必要はないはずだ。LILOをLinuxルートパーティションにインストールした場合のシーケンスを以下に示す。
[LILOをルートパーティションに置いた場合のNTと98とLinuxのトリプルブートのシーケンス]
この方法の利点としてはMBRを一般のものにしておけることだろう。しかし私見としては両方の良いとこどりができるフロッピーインストールがいいと考える。つまりMBRもいじらないし、Linuxパーティションの種類の制約もない。もっともいずれの方法を選んだとしても、後からいくらでも変更がきくので、それほど拘泥する必要はない。
まあインストール時には作れなくても、後で前述のようにlilo.confを書き換えて、LILOを作り直しても大丈夫である。その場合、Windowsがどこにインストールされているかが重要だ。大抵は第1 IDE HDDの最初の基本パーティションだと思うので、「/dev/hda1」でいいと思うが、SCSI HDDなら「/dev/sda1」になるし、2番目のパーティションの場合(殆どそういうことはないと思うが)は「/dev/hda2」とする必要がある。
いずれにしてもパーティション構成はちゃんと設計する必要があるだろう。基本的には以下のような構成が普通なのではないだろうか?
[Windows95、WindowsNT、Linuxのトリプルブートのパーティション構成]
Windowsのパーティション構成については既に説明した。Linuxのパーティションに関しては上記例はLinuxルートパーティションにLILOを置いた場合なので、基本領域でかつアクティブにしているが、LILOをMBRやフロッピーに置く場合はここを論理領域にしても構わない。
Linuxの領域はLinuxのfdiskで作成するが、Linuxのfdiskは大変柔軟なため、殆どなんでもありという感じだが、反面多くのOS(Windowsなどもそう)では読めないシリンダー境界をまたがった領域を作れてしまう。だからWindows用の領域はこれに作成を任せない方が無難である。Linuxの領域は基本でも論理でも構わない。論理でもブートできる。
因みにLinuxのパーティションの位置だが、LILOのバージョンにより、その制限が異なる。Version21以前のLILOの場合、8GB以内に置く必要がある。Version21 rev3以降ならこのバージョンからサポートするグローバルオプション「lba32」を指定することで、この制限を回避することができる。ただしBIOSが拡張INT13Hをサポートしている必要もある。「lba32」オプションはデフォルトでは有効にならないので、必ず明示的に指定する必要がある。尚このオプションは「linear」オプションとは排他なので、もし記述されている場合は「linear」オプションを削除してほしい。
しかしLinuxカーネル自体は当初から8GB問題を持っていなかったので、カーネルさえ起動してしまえば、その後の動作は問題ない。そこで、LILOを構成するファイル(普通は/bootにある)とカーネルのみ8GB以内に置いておけば、その他のデータはそれ以降に置いても大丈夫である。起動用に10数MBの小さなパーティションを作り、ここに/bootとカーネルを置くというのは昔から8GB問題を回避する常套手段だった。まあ新しいLILOを使えばこんな苦労もいらないが。
とにかくパーティション構成さえ特に変わった構成にしようとしない限り、通常はLILOとNTLDRを使った2段構えのトリプルブートはいとも簡単に実現できてしまうのが、理解頂けただろうか。
しかしこの2段構えではちょっと格好よくない。複数を一つのメニューから一遍に選べた方が便利だし、格好いいだよね。つまり1段で何とかならないだろうか。これからその方法を紹介する。
NTLDRには他のブートセクターを選択して読み込ませることができると説明した。Windows9xとWindows NTのデュアルブートも元のWindows9xのブートセクターをファイル化してこれを読み込ませることで実現していることは既に説明した。これにLinuxを加えてトリプルブートするのも、この手法の単純な応用に過ぎない。NTLDRにファイル化したLILO(正確にはLILOの1st Boot Loader)を読み込ませてしまおうというのがこの方法である。
インストール手順は特に凝ったことをする必要はない。パーティション構成も前述のものと同じようなもので構わない。実際前述の2段構えのトリプルブート環境から、その後こちらに移行することも可能だ。ここではその方法で説明しよう。大まかな手順は以下のようになる。
まずLILOをファイル化するにあたって、それがWindows NTのNTLDRから見えるものにしなければならないので、FAT16かNTFS(Windows2000ならFAT32も)上に書き込む必要がある。そこでこれらの領域をLinux上でマウントしなければいけない。NTFSやFAT32の場合、Linuxカーネルが対応しているか確認する必要がある。DOSフォーマットのフロッピーをマウントしてもいいだろう。マウントの方法はいろいろあるので、ここでは細かく説明しないが、Windowsとのマルチブート環境で使っていくなら、常時LinuxからWindows領域を見たいだろうから、やはり/etc/fstabに記述してしまうのが一般的だろう。大抵のLinuxインストーラはインストール中にWindows領域をマウントするフェーズがあるはずである。この時指定すれば、/etc/fstabにマウント情報が記述され起動時に自動的にWindows領域をマウントしてくれる。以下に起動時にWindows領域をマウントする/etc/fstabの記述例を示す。
[Windows領域をマウントする/etc/fstabの内容]
/dev/hda1 /mnt/win vfat uid=201,gid=100,umask=000 1 0 |
上記のように設定すると、第1IDEハードディスク上の最初にパーティションにあるWindows領域が、Linux上では「/mnt/win」にマウントされる。上記例ではUSER ID 201のユーザでも書き込めるようになっている。自分の環境に合わせてカスタマイズしてみてほしい。これくらいのことがサラッとできないようではあまりLinuxとのマルチブートなど考えない方がいいかもしれない。
次にLILOのファイル化だが、これは「dd」コマンドを使う。LILOをどこにインストールしたかによってコマンドの指定の仕方が変わる。以下の例はLILOをMBRにインストールした場合である。
dd if=/dev/hda of=/mnt/win/linux.pbr bs=512 count=1 |
ここではddコマンドの細かい仕様の説明はしないが、ifパラメータに書き込み元、ここではIDEの第1HDDの先頭(ここにMBRはある)を示す「/dev/hda」を指定する。ofパラメータには書き込み先として、Windowsパーティションをマウントしてある場所にファイル名(例ではlinux.pbr)まで指定する。bsパラメータはブロックサイズで、ここではセクターサイズである512(bytes)を指定。countパラメータはブロック数として1を指定する。
これでWindowsパーティション上に、「linux.pbr」というファイル名でLILOがファイル化される。
次にLinuxをshutdownしてWindows NTを起動する。この時点ではまだMBRのLILOを経由してWindows NTを起動しているはずだ。起動してCドライブの直下を見てほしい。512Bytesの「linux.pbr」というブートセクターファイルができているはずである。ここでboot.iniを編集してこのファイルを読み込むメニューを追加しよう。
[Linuxをブートできる場合のboot.iniの内容]
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00 [VGA mode]" /basevideo /sos C:\="Microsoft Windows" C:\linux.pbr="Linux Slackware" |
こうするとメニューに「Linux Slackware」が追加され、これを選択した時は「C:\linux.pbr」というファイル化したLILOが読み込まれて実行される。
最後の作業はLILOをどこにインストールしたかによって変わる。MBRにインストールした場合はLILOを削除してしまおう。Windowsの起動ディスクで起動して、「fdisk /mbr」というコマンドを打つ。厳密にはLILOを削除するというよりはMBRのプログラム領域をPC/AT互換機一般のブートストラップローダに戻すということである。これによって直接Cドライブのブートセクターが読み込まれ、結局NTLDRが先に読み込まれるようになる。
LILOをLinuxルートパーティションにインストールしている場合はこの領域がアクティブになっているだろうから、fdiskを使って、NTLDRのある領域(たぶん先頭の基本領域)をアクティブにする。
LILOをフロッピーにインストールしていて、MBRはPC/AT互換機のもののままであり、NTLDRのあるパーティションがアクティブであるなら、これらの作業は必要ない。
これでNTLDRによるWindows9x系とWindows NT系とLinuxのトリプルブートは完成である。完成した場合のブートシーケンスは次のようになる。
[NTLDRによるNTと98とLinuxのトリプルブートのシーケンス]
PCを起動してハードディスクにアクセスするとMBRからアクティブ基本領域のブートセクターが読み込まれ、ここにNTのブートセクターがあるので、すぐにNTLDRが読み込まれる。すると次のようなOS選択画面が出る。
[NTLDRによるOS選択画面(+Windows95+Linux)]
OS Loader V4.00 オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してほしい。 システムが自動的に起動するまで: 30 |
ここでWindows NTを選択すればWindows NTが、『Microsoft Windows』を選択すれば、「C:\bootsect.dos」が読み込まれてWindows95が起動するのは以前の説明どおり。そして『Linux Slackware』を選択すると「c:\linux.pbr」が読み込まれ、ここにあるLILOが実行を開始する。このLILOも以前のものと何ら変わりないので、ここでまた「win」とタイプしてまたNTLDRに戻ることもできる。その気になれば、またここでLinuxを選択してどうどう巡りさせることもできる。(やってどうする)
ところで、この方法で注意することはNTLDRによって読み込まれる、LILOをファイル化したブートセクターファイルはLinuxパーティションにあるLILO(の1st Boot loader)が含まれたブートセクターのコピーだから、元のLILOを更新した場合でも、このブートセクターファイルが更新される訳ではないということである。LILOの更新時には必ずこのファイルも更新(またddコマンドを実行)しないといけない。そうしないと、起動不能になることが多いので気をつけよう。
因みにこの方法はFreeBSDやBeOSなど自領域をアクティブにする必要のないOSなら全て、同じ手法で実現できる非常に汎用的な方法である。是非仕組みをよく理解して応用してみてほしい。注意点は「NTLDRによる各OSの起動」で多少説明しているから、トラぶったら読んでみてほしい。
上記方法はNTLDRによるマルチブート手法としてはオーソドックスでかなり以前から行われており、雑誌や各Webサイトにもよく紹介されている方法なのでご存知だった方が多いと思う。これ以外にも「Windows初級編」で紹介したBootPartユーティリティを使ったNTLDRによるマルチブートの方法がある。
まずは事前準備として、LILOはルートパーティションにインストールする。そして、WindowsNT/2000上、DOS上で以下のような手順でBootPartコマンドを実行し、マルチブート環境を作成する。
最初に、「bootpart」と何もパラメータを指定しないで実行する。そうすると以下のようにパーティション情報が表示される。
[パーティションの表示]
C:\BOOTPART>bootpart Boot Partition 2.20 for WinNT (c) 1995-98 G. Vollant (info@winimage.com) WEB : http://www.winimage.com and http://www.winimage.com/bootpart.htm Add partition in the Windows NT Multi-boot loader Run "bootpart /?" for more information 0 : C:* type=b (Win95 Fat32), size = 1670728 KB 1 : C: type=f (Win95 XInt 13 extended), size = 16265812 KB 2 : C: type=b (Win95 Fat32), size = 1309266 KB 3 : C: type=5 (Extended), size = 1429785 KB 4 : C: type=b (Win95 Fat32), size = 1429753 KB 5 : C: type=5 (Extended), size = 11406150 KB 6 : C: type=b (Win95 Fat32), size = 11406118 KB 7 : C: type=5 (Extended), size = 2000092 KB 8 : C: type=83 (Linux native), size = 2000061 KB 9 : C: type=5 (Extended), size = 120487 KB 10 : C: type=82 (Linux swap), size = 120456 KB 11 : C: type=c (Win95 Fat32 LBA), size = 2000092 KB C:\BOOTPART> |
目的のLinuxのパーティションが「8」番であることが分かると思う。そして次のようなシンタックスのコマンドを実行する。
> BOOTPART パーティション番号 ブートファイル [メニューエントリ名]
パーティション番号は先に表示したものの各行(パーティション)の先頭の番号である。ブートファイルはこれが起動したいパーティションのブートセクターを起動するIPLが含まれるファイルになる。任意の名称で作成する。メニューエントリ名はboot.iniファイルのエントリになるものである。最後のメニューエントリは省略可能だ。省略した場合はboot.iniにエントリを追加しない。
[ブートファイルの作成とboot.iniへのエントリの追加]
C:\BOOTPART>bootpart 8 bootfile.lnx Turbo Linux 6.0 |
上記例ではbootsect.lnxというブートファイルがカレントディレクトリに作成され、そのファイルへのエントリがboot.iniファイルに追加される。boot.iniファイルは以下のようになっただろう。
[Linuxのエントリが追加されたboot.iniの内容]
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00" multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows NT Workstation Version 4.00 [VGA mode]" /basevideo /sos C:\="Microsoft Windows" C:\BOOTPART\bootfile.lnx="Turbo Linux 6.0" |
起動画面は以下のようになったはずである。
[NTLDRによるOS選択画面(+Windows95+Linux)]
OS Loader V4.00 オペレーティング システムの選択
↑ キーと ↓ キーを使って、起動するオペレーティング システムを選択し、 Enter キーを押してほしい。 システムが自動的に起動するまで: 30 |
作業はたったこれだけである。先に紹介したオーソドックスな方法よりもずっと簡単だったと思う。更にこの方法にはもう一つの利点がある。
先の方法と違い、BootPartが作成するブートファイル(例ではC:\BOOTPART\bootfile.lnx)は指定パーティションのブートセクターをファイル化したものではない。このファイルは指定パーティションのブートセクターをロードすることだけを行う、一種のブートローダである。
だから、先の方法の場合、LinuxルートパーティションにあるLILOを更新した時、ブートセクターファイルも更新する必要があるが、この方法の場合はその必要がない訳である。あまり知られた方法ではないが、なかなかいい方法だと思う。
しかしここまでこの方法を推奨しておいて、こんなことを言うのは変だが、ことLILOに関してはこの方法は大変失礼なやりかたである。結局この方法ではLILOのOS選択機能は全く使われておらず、単なるLinux起動に使われているだけである。NTLDRを使う一例として紹介したが、本来機能としてはNTLDRはLILOの足元にも及ばない。
マルチOSの中にLinuxが含まれるなら、他のブートローダは全く必要がないほどの驚くべき潜在能力をLILOは持っているので、こちらを使いこなしてみても面白いと思う。さすがUNIX文化とも思える取っ付き難いが奥が深く、知れば知るほどのめり込んでいく(なんかviに良く似てる)不思議な魅力がある。その高度な使い方は「Linux中級編」で解説するが、次の機能編は読み飛ばさないでほしい。